package tech.aistar.mapper;

import org.apache.ibatis.annotations.*;
import tech.aistar.pojo.User;
import tech.aistar.pojo.UserVo;

import java.util.List;

public interface UserMapper {
    /**
     * 查询所有用户
     * @return all
     */
    @Select("select * from t_user")
    List<User> findAll();

    /**
     * 因为邮箱是唯一的
     * 根据邮箱查找用户
     * @param email 邮箱
     * @return 单个用户
     */
    @Select("select * from t_user where email=#{value}")
    User getByEmail(String email);

    /**
     * 根据id进行删除
     * @param id 用户的id
     * @return 受影响的行数，比如成功删除了一行，返回数字1.如果删除失败，返回数字0
     */
    @Delete("delete from t_user where id=#{value}")
    int delById(Integer id);

    /**
     * 根据用户名和密码查找用户
     * @param username username
     * @param password password
     * @return 成功则返回对应的user对象，否则返回null(对象的默认值都是null)
     */
    @Select("select * from t_user where username=#{username} and password=#{password}")
    User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

    /**
     * 使用一个第三方的对象来封装查询条件，只要保证占位符#中的单词的名称和第三方类中定义的属性名高度一致即可
     * @param userVo userVo
     * @return ..
     */
    @Select("select * from t_user where username=#{uname} and password=#{pwd}")
    User getByUsernameAndPassword(UserVo userVo);

    /**
     * 插入用户
     * @param user 用户对象
     * @return 受影响的行数
     */
    @Insert("INSERT INTO t_user(username, email, password, role, header_img) " +
            "VALUES(#{username}, #{email}, #{password}, #{role}, #{headerImg})")
    @Options(useGeneratedKeys = true, keyProperty = "id") // 自增主键回填到User对象
    int insertUser(User user);

    /**
     * 通过id查询用户
     * @param id id
     * @return 单个用户
     */
    @Select("select * from t_user where id=#{value}")
    User getById(int id);

    /**
     * 根据id更新用户信息
     * @param user 用户对象
     * @return 受影响的行数
     */
    @Update("UPDATE t_user SET username=#{username}, email=#{email}, password=#{password}, " +
            "role=#{role}, header_img=#{headerImg} WHERE id=#{id}")
    int updateUser(User user);
}

